package com.example.a_java.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.a_java.entity.RepaymentInstallment;
import com.example.a_java.entity.RepaymentPlan;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 还款计划Service接口
 */
public interface RepaymentPlanService extends IService<RepaymentPlan> {

    /**
     * 查询还款计划分页列表
     *
     * @param pageNum      当前页码
     * @param pageSize     每页大小
     * @param contractNo   合同编号
     * @param loanNo       贷款编号
     * @param customerName 客户姓名
     * @param repayStatus  还款状态
     * @param repayMethod  还款方式
     * @param startDate    开始日期
     * @param endDate      结束日期
     * @return 还款计划分页数据
     */
    Page<RepaymentPlan> getRepaymentPlanPage(int pageNum, int pageSize, String contractNo, String loanNo,
                                           String customerName, Integer repayStatus, String repayMethod,
                                           String startDate, String endDate);

    /**
     * 获取还款计划详情，包括分期明细
     *
     * @param planId 还款计划ID
     * @return 包含分期明细的还款计划详情
     */
    Map<String, Object> getRepaymentPlanDetail(Long planId);

    /**
     * 根据贷款编号获取还款计划
     *
     * @param loanNo 贷款编号
     * @return 还款计划及其分期明细
     */
    Map<String, Object> getRepaymentPlanByLoanNo(String loanNo);

    /**
     * 生成还款计划
     *
     * @param contractId 合同ID
     * @return 生成结果
     */
    Map<String, Object> generateRepaymentPlan(Long contractId);

    /**
     * 批量生成还款计划
     *
     * @param contractIds 合同ID列表
     * @return 批量生成结果
     */
    Map<String, Object> batchGenerateRepaymentPlan(List<Long> contractIds);

    /**
     * 调整还款计划
     *
     * @param planId        计划ID
     * @param adjustments   调整详情
     * @param reason        调整原因
     * @param attachmentUrls 附件URL列表
     * @return 调整结果
     */
    Map<String, Object> adjustRepaymentPlan(Long planId, List<Map<String, Object>> adjustments, 
                                         String reason, List<String> attachmentUrls);

    /**
     * 计算罚息
     *
     * @param installmentId 分期ID
     * @param overdueDays   逾期天数
     * @return 罚息计算结果
     */
    Map<String, Object> calculatePenalty(Long installmentId, Integer overdueDays);

    /**
     * 获取统计数据
     *
     * @return 统计数据
     */
    Map<String, Object> getStatistics();

    /**
     * 获取贷款编号下拉列表
     *
     * @param keyword 关键字
     * @param status  状态
     * @return 贷款编号列表
     */
    List<Map<String, Object>> getLoanNumbers(String keyword, Integer status);

    /**
     * 获取客户姓名下拉列表
     *
     * @param keyword 关键字
     * @return 客户姓名列表
     */
    List<Map<String, Object>> getCustomerNames(String keyword);

    /**
     * 获取还款状态列表
     *
     * @return 还款状态列表
     */
    List<Map<String, Object>> getRepaymentStatuses();

    /**
     * 获取还款方式列表
     *
     * @return 还款方式列表
     */
    List<Map<String, Object>> getPaymentMethods();
} 